SET QUOTED_IDENTIFIER OFF 
go
IF OBJECT_ID('SendMail') IS NOT NULL  
  DROP PROCEDURE SendMail
go
CREATE PROCEDURE SendMail --SET QUOTED_IDENTIFIER OFF 
--				@From varchar(8000) = 'SQLAdmin@michael.com', 
				@From varchar(8000) = 'sqlagent@michael.com', 
				@To varchar(8000),	-- plain list of emails delimited by ","; NO "<" or ">" symbols 
							--OR named list in form: Name Me So <name_me_so@domain.com>; ..."
				@Subject varchar(8000),
--(070417)				@Message varchar(8000),
				@Message text,
				--Valid hostname or IP address pointing an SMTP mail server
				@Server varchar(500) = 'stmp.iomartmail.com', --worked with it from here too, but
				@Pwd varchar(100) = 'sql'
/*
				@From varchar(8000) = 'hardcode_it_here', 
				@To varchar(8000),	-- plain list of emails delimited by ","; NO "<" or ">" symbols 
							--OR named list in form: Name Me So <name_me_so@domain.com>; ..."
				@Subject varchar(8000),
				@Message varchar(8000),
				--Valid hostname or IP address pointing an SMTP mail server
				@Server varchar(500) = 'hardcode_it_here', --worked with it from here too, but
				@Pwd varchar(100) = 'hardcode_it_here'
*/
/*
This procedure is to
	a) decorate technical approach - CDOSys or xp_smtp_sendmail
	b) convert plain mails list into named like Victor Blokhin <victor@infoplanet-usa.com>; SQLAdmin <SQLAdmin@michael.com>
*/
/*TEST
--Message > 4000 and < 8000
DECLARE @i int, @j int, @msg varchar(8000)
	SELECT @j = 1, @msg = ''
	WHILE @j <= 6 BEGIN
		SET @i = 1
		WHILE @i <= 1000 BEGIN
			SELECT @msg = @msg + convert(varchar(10), @j)
			SET @i = @i + 1
		END
		SELECT @msg = @msg + CHAR(10)
		SET @j = @j + 1
	END
	declare @err int
	exec @err = SendMail @To = 'victor@michael.com',
		@Subject = 'SendMail test Message > 4000 and < 8000',
		@Message = @msg
SELECT @err, @@ERROR

--Message > 8000
DROP TABLE #SendMail_Message
CREATE TABLE #SendMail_Message (id int IDENTITY, nstr nvarchar(1000))
DECLARE @i int, @j int, @msg varchar(8000)
	SELECT @j = 1, @msg = ''
	WHILE @j <= 9 BEGIN
		SET @i = 1
		SELECT @msg = ''
		WHILE @i <= 999 BEGIN
			SELECT @msg = @msg + convert(varchar(10), @j)
			SET @i = @i + 1
		END
		INSERT INTO #SendMail_Message (nstr) VALUES (@msg)
--		SELECT @msg = @msg + CHAR(10)
		SET @j = @j + 1
	END
--SELECT * FROM #SendMail_Message

declare @err int
	exec @err = SendMail @To = 'victor@michael.com',
		@Subject = 'SendMail test Message > 8000',
		@Message = NULL
SELECT @err

--error handling
declare @err int
	exec @err = SendMail @To = 'victor@michael.com',
		@Subject = 'SendMail test Message > 8000',
		@Message = NULL,
		@Pwd  = 'sql_bad'
SELECT @err

	



declare @err int
	exec @err = SendMail @To = 'victor@michael.com',
		@Subject = 'SendMail test Message > 8000',
		@Message = '
1           111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
2           222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
3           333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333
4           444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444
5           555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555
6           666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666
7           777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777
8           888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
9           999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999'
SELECT @err, @@ERROR






DROP TABLE #Message
CREATE TABLE #Message (msg text)
INSERT INTO #Message VALUES('1234567890')

DECLARE @ptrval binary(16)
SELECT @ptrval = TEXTPTR(msg) 
   FROM #Message
SELECT * FROM #Message
UPDATETEXT #Message.msg @ptrval 5 0 'aaa' 
SELECT * FROM #Message


EXEC sp_dboption 'SQLAdmin', 'select into/bulkcopy', 'false'


DROP TABLE #Message
CREATE TABLE #Message (msg text)
INSERT INTO #Message VALUES('')

DECLARE SendMailMessage_cur CURSOR FOR SELECT nstr FROM #SendMail_Message ORDER BY id
DECLARE @msg nvarchar(4000)
DECLARE @ptrval binary(16), @mlen int
OPEN SendMailMessage_cur
WHILE 1 = 1 BEGIN 
	FETCH NEXT FROM SendMailMessage_cur INTO @msg
	SELECT @msg = left(@msg, 3999) + CHAR(10) 
	IF @@FETCH_STATUS <> 0 BREAK

	SELECT @ptrval = TEXTPTR(msg) FROM #Message

	SELECT @mlen = Datalength(msg) FROM #Message
	SELECT * FROM #Message
	UPDATETEXT #Message.msg @ptrval @mlen 0 @msg
	SELECT * FROM #Message
END

	

END






declare @err int
exec @err = master.dbo.xp_smtp_sendmail @server      = N'mail.infoplanet-usa.com', @ping = 1
DECLARE @is_log bit, @is_warn bit
SELECT @is_log = 1, @is_warn = 0
IF @err <> 0 SELECT @is_log = 0, @is_warn = 1
EXEC ADM_WRITE_SQL_ERR_LOG 	@SystemName = 'SQLAdmin', 
				@AgentName = 'SQLAdmin.PingSMTPServer',
				@Statement = 'exec @err = master.dbo.xp_smtp_sendmail @server      = N''mail.infoplanet-usa.com'', @ping = 1',
				@ErrCode = @err, 
--				@RecordCount = @rcnt,
				@LogDesc = 'Ping continiously to determine if network is always available',
				@IsLogOnly = @is_log,
				@IsWarnOnly = @is_warn
--SELECT * FROM SQL_ERR_LOG

*/

AS BEGIN
--SELECT 'enter sendmail'
--declare a set of standard error logging variables
	DECLARE @proc_name sysname				--used for unified calling of ADM_WRITE_SQL_ERR_LOG 
	DECLARE @db_name sysname				-- ----""------
	SELECT 	@proc_name = name, @db_name = db_Name() FROM sysobjects WHERE id = @@PROCID
			
	DECLARE @err int, @rcnt int				--"global" vars for ADM_WRITE_SQL_ERR_LOG
	DECLARE @log_desc nvarchar(1000)			-- ----""------
	DECLARE @stmnt_lastexec nvarchar(255)	-- ----""------
	DECLARE @hr_obj int	-- var for OAGetErrorInfo
	DECLARE @hr int		-- HRESULT

	SELECT @stmnt_lastexec = "IF (patIndex('%[<>]%', @To) = 0 BEGIN...."	
	IF (patIndex('%[<>]%', @To) = 0) BEGIN

		SELECT @stmnt_lastexec = "SELECT * INTO Mail FROM StringListToTable(@To)...."	
		SELECT * INTO #Mail FROM StringListToTable(@To, ',')
		SELECT @err = @@ERROR, @rcnt = @@ROWCOUNT
		IF (@err <> 0 OR @rcnt < 1) GOTO Err

		DECLARE @to_named nvarchar(4000)
		SELECT @to_named = isNull(@to_named + '; ', '')
				+ left(nstr, charIndex('@', nstr) - 1)
				+ ' <' + nstr + '>' 
			FROM #Mail 
			ORDER BY listpos
--SELECT @@ERROR
		SELECT @err = @@ERROR, @rcnt = @@ROWCOUNT
		IF (@err <> 0) GOTO Err

--SELECT @to_named --debug
		SELECT @To = @to_named 
	END

	CREATE TABLE #Message (msg text)
	INSERT INTO #Message VALUES('')


	IF (OBJECT_ID('tempdb..#SendMail_Message', 'U') IS NOT NULL) AND @Message IS NULL BEGIN

--		SELECT @Message = isNull(@Message + CHAR(10) + nstr, nstr)  
--			FROM #SendMail_Message ORDER BY id
--		DROP TABLE #Message
		--SELECT @Message = msg FROM #Message
		
		DECLARE SendMailMessage_cur CURSOR FOR SELECT nstr FROM #SendMail_Message ORDER BY id
		DECLARE @msg nvarchar(4000)
		DECLARE @ptrval binary(16), @mlen int
		OPEN SendMailMessage_cur
		WHILE 1 = 1 BEGIN 
			FETCH NEXT FROM SendMailMessage_cur INTO @msg
			SELECT @msg = left(@msg, 3999) + CHAR(10) 
			IF @@FETCH_STATUS <> 0 BREAK
		
			SELECT @ptrval = TEXTPTR(msg) FROM #Message
		
			SELECT @mlen = Datalength(msg) FROM #Message
--SELECT * FROM #Message
			UPDATETEXT #Message.msg @ptrval @mlen 0 @msg
--SELECT * FROM #Message
		END
		CLOSE SendMailMessage_cur
		DEALLOCATE SendMailMessage_cur
	END ELSE BEGIN 
		UPDATE #Message SET msg = @Message
	END

--SELECT @From, @To, @Subject
--SELECT @Message

	DECLARE @str_output nvarchar(500) 

	SELECT @stmnt_lastexec = "SELECT @CDOSysSendMailFUNC_Output = dbo.CDOSysSendMailFUNC (...."		
	SELECT @str_output = dbo.CDOSysSendMailFUNC (
				 	@From,
					@To,
					@Subject,
					msg,
					@Server,
					@Pwd) FROM #Message

	IF (@str_output <> '0') BEGIN
		DECLARE @str_hr_obj varchar(20), @str_hr varchar(20), @pos int
--SELECT @str_output
		SELECT @pos = charIndex(',', @str_output)
		SELECT @str_hr_obj = subString(@str_output, 1, @pos-1)
--SELECT @str_hr_obj 
		SELECT @str_output = subString(@str_output, @pos+1, len(@str_output))
--SELECT @str_output
		SELECT @pos = charIndex(',', @str_output)
		SELECT @str_hr = subString(@str_output, 1, @pos-1)
--SELECT @str_hr 
		SELECT @stmnt_lastexec = subString(@str_output, @pos + 1, len(@str_output))

		SELECT @hr_obj = convert(int, @str_hr_obj), @hr = convert(int, @str_hr)
		SET @log_desc  = dbo.OAGetErrorInfo (@hr_obj, @hr) 
--SELECT @log_desc 
		SET @err = isNull(@hr, -4711)
--071011		GOTO Err

		EXEC ADM_WRITE_SQL_ERR_LOG 	@SystemName = @db_name, 
							@AgentName = @proc_name,
							@Statement = @stmnt_lastexec, 
							@ErrCode = @err, 
							@RecordCount = @rcnt, 
							@LogDesc = @log_desc,
							@EMNotify = NULL, 
							@UserId = NULL,
							@IsWarnOnly = 1
		SET @err = -1

	END
/* 070612
	SELECT @stmnt_lastexec = "EXEC @err = CDOSysSendMail 	@From  = @From,...."		
	EXEC @err = CDOSysSendMail 	@From  = @From,
					@To = @To,
					@Subject = @Subject,
					@Message = @Message,
					@Server = @Server,
					@Pwd = @Pwd
	IF (@err <> 0) GOTO Err
*/
	RETURN @err
Err:
	EXEC ADM_WRITE_SQL_ERR_LOG 	@SystemName = @db_name, 
							@AgentName = @proc_name,
							@Statement = @stmnt_lastexec, 
							@ErrCode = @err, 
							@RecordCount = @rcnt, 
							@LogDesc = @log_desc,
							@EMNotify = NULL, 
							@UserId = NULL
--failure end
	RETURN @err
END
GO